<?php
// error_reporting( E_ALL ^ E_NOTICE ^ E_WARNING );
// 描述该文件返回一张图片
header( 'Content-Type:image' );
// 120,  设置生成的图片宽度
$width = 120;
// 40, 设置生成的图片高
$height = 40;

// 根据设置高度和宽度 定义一张新的( 默认背景色为黑色 )图像画板。创建真彩图像资源
$img = imagecreatetruecolor( $width, $height );

/* 为一幅图像分配颜色
根据三原色创建 颜色对象, 提供给 GD 使用 ( 颜色取值 0~255 )
imagecolorallocate( $image, $red, $green, $blue );
背景颜色 取值 200~255 便于和 验证码 文字 的颜色区分
Note:第一次对 imagecolorallocate() 的调用会给基于调色板的图像填充背景色，即用 imagecreate() 建立的图像。
*/
$bgColor = imagecolorallocate( $img, rand( 200, 255 ), rand( 200, 255 ), rand( 200, 255 ) );

/* 背景色填充
imagefill ( $image, $x, $y, $color );
x, y 分别为填充的起始 x 坐标和 y 坐标，与 x, y 点颜色相同且相邻的点都会被填充。即从 该点处 开始填充整个图片
*/
imagefill( $img, 0, 0, $bgColor );

// 干扰线
for ( $i = 0; $i < 10; $i++ ) {
    // 为一幅图像分配颜色
    $lineColor = imagecolorallocate( $img, rand( 0, 200 ), rand( 0, 200 ), rand( 0, 200 ) );
    /* 画一条线段
    imageline ( resource $image, int $x1, int $y1, int $x2, int $y2, int $color )
    用 color 颜色在图像 image 中从坐标 x1，y1 到 x2，y2（图像左上角为 0, 0）画一条线段
    */
    imageline( $img, rand( 0, $width ), rand( 0, $height ), rand( 0, $width ), rand( 0, $height ), $lineColor );
}
// 干扰点
for ( $i = 0; $i < 200; $i++ ) {
    // 为一幅图像分配颜色
    $poitColor = imagecolorallocate( $img, rand( 0, 200 ), rand( 0, 200 ), rand( 0, 200 ) );
    /* 在指定的坐标处绘制像素( 一个点 )
    imagesetpixel ( resource $image, int $x, int $y, int $color )
    */
    imagesetpixel( $img, rand( 0, $width-4 ), rand( 0, $height-4 ), $poitColor );
}

// 存放最终生成的验证码
$code = '';
// 随机验证码文字的后选区
$words = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
// $string[0] = a  $string[2] = c

$font = './cordia.ttf';
for ( $i = 0; $i<4; $i++ ) {
    // 根据三原色创建颜色，提供给GD使用   颜色取值 0~255
    $strColor = imagecolorallocate( $img, rand( 10, 100 ), rand( 10, 100 ), rand( 10, 100 ) );
    $temp = $words[rand( 0, strlen( $words )-1 )];
    $code .=  $temp;
    /* 自带的函数: 水平地画一行字符串
    imagestring ( resource $image, int $font, int $x, int $y, string $s, int $col )
    用 col 颜色将字符串 s 画到 image 所代表的图像的 x，y 坐标处（这是字符串左上角坐标，整幅图像的左上角为 0，0）。
    如果 font 是 1，2，3，4 或 5，则使用内置字体。( 字体都比较小 )
    */
    // imagestring( $img, 15, rand( $i*20+10, ( $i+1 )*30-20 ), rand( 0, $height-15 ), $temp, $strColor );

    // freetype扩展中函数 mac系统自带的php没有( 要安装新的php )
    /* imagettftext 用 TrueType 字体向图像写入文本
    imagettftext ( resource $image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text )
    image 图像, size 字体的尺寸,
    angle 角度制表示的角度，0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。
    x: 由 x，y 所表示的坐标定义了第一个字符的基本点（是字符的左下角）。
    y: 它设定了字体基线的位置，不是字符的最底端。 类似line-height
    fontfile 字体文件路径( 相对路径 )
    text 被绘制的( UTF-8 编码的 )文字
    */
    // imagettftext ( $img, 36, 0, $i*25+10, 30, $strColor, $font, $temp );
    // 随机角度 和 文字位置
    imagettftext ( $img, 40, rand( -45, 45 ), rand( $i*25+10, $i*25+20 ), 30, $strColor, $font, $temp );
}
// 存入 session 方便使用 验证码对应的字符串值
$_SESSION['code'] = $code;

// 向浏览器输出jpeg图片
imagejpeg( $img );
// 生成的图片销毁
imagedestroy( $img );
?>